<template>
	<view class="key-container" @click="hide" v-show="showMask">
		<uni-transition :modeClass="['slide-bottom']" :show="show" :styles="{height:'100%'}" :duration="duration">
			<view class="key-content" @click.stop>
				<slot></slot>
				<view class="key-box block flex">
					<view class="key-left">
						<view class="key-top flex flex-wrap">
							<view class="btn-box" v-for="(item,index) in numArr" :key="index">
								<button hover-class="active" class="cu-btn key-btn text-black text-xl" @click.stop="keydown(item)">{{item}}</button>
							</view>
						</view>
						<view class="key-bottom">
							<view class="btn-zero">
								<button hover-class="active" class="cu-btn key-btn text-black text-xl" @click.stop="keydown('0')">0</button>
							</view>
							<view class="btn-point">
								<button hover-class="active" class="cu-btn key-btn text-black text-xl" @click.stop="keydown('.')">.</button>
							</view>
						</view>
					</view>
					<view class="key-right">
						<view class="del">
							<button hover-class="active" class="cu-btn key-btn text-black text-xl" @click.stop="del">
								<text class="zm iconbackspace text-xl"></text>
							</button>
						</view>
						<view class="confirm">
							<!-- #ifdef APP-PLUS -->
							<button hover-class="active" :style="confirmStyle" class="cu-btn" @click.stop="confirm">
								<text class="confirm-text">{{confirmText}}</text>
							</button>
							<!-- #endif -->
							<!-- #ifndef APP-PLUS -->
							<button hover-class="active" :style="[confirmStyle]" class="cu-btn" @click.stop="confirm">
								<text class="confirm-text">{{confirmText}}</text>
							</button>
							<!-- #endif -->
						</view>
					</view>
				</view>
				<u-safe-bottom v-if="safeAreaInsetBottom"></u-safe-bottom>
			</view>
		</uni-transition>
	</view>
</template>

<script>
	/**
	 * 付款组件
	 * @property {Number} duration - 弹出动画时长，默认为300
	 * @event {Function} change - 数字改变触发，参数为数字
	 * @event {Function} confirm - 付款时触发，参数为数字
	 * @event {Function} hide - 关闭键盘触发，参数为空
	 */
	// 使用方法,查看同级目录exmple
	import uniTransition from '../uni-transition/uni-transition.vue'
	export default {
		components: {
			uniTransition
		},
		props: {
			//输入值
			amount: {
				type: String,
				default: ''
			},
			//弹出动画时长
			duration: {
				type: Number,
				default: 300
			},
			confirmText: {
				type: String,
				default: '确认'
			},
			confirmStyle: {
				type: Object,
				default: () => {
					return {}
				}
			},
			//是否为iPhoneX留出底部安全距离
			safeAreaInsetBottom: {
				type: Boolean,
				default: uni.$u.props.popup.safeAreaInsetBottom
			},
			//配置最低金额
			miniMoney: {
				type: Number, //默认0不限制
				default: 0
			},
			//当前焦点位置
			curIndex: {
				type: Number,
				default: 0
			}
		},
		data() {
			return {
				value: '', //输出的值
				show: false, //显示键盘
				showMask: false, //遮罩层
				numArr: [1, 2, 3, 4, 5, 6, 7, 8, 9],
			}
		},
		watch: {
			value(newval, oldval) {
				this.$emit("change", newval);
			}
		},
		methods: {
			close() {
				this.show = false;
				setTimeout(() => {
					this.showMask = false;
				}, this.duration);
				this.$emit("close");
			},
			open() {
				this.value = this.amount;
				this.show = true;
				this.showMask = true;
				this.$emit("open");
			},
			del() {
				if (this.value.length) {
					if (this.curIndex > 0 && this.curIndex == this.value.length) {
						this.value = this.value.slice(0, this.value.length - 1);
					} else if (this.curIndex > 0 && this.curIndex < this.value.length) {
						// 转成数组
						let arr = this.value.split('');
						// 删除操作
						arr.splice(this.curIndex - 1, 1);
						// 转成字符串
						let str = arr.join('');
						// 重新赋值
						this.value = str;
					}
				}
			},
			keydown(e) {
				// 百万整数拦截
				if (e != '.' && this.value.indexOf('.') == -1 && this.value.length >= 7) {
					return;
				}
				// 百万小数拦截
				let _integer = this.value.indexOf('.') != -1 ? this.value.substr(0, this.value.indexOf('.')) : '';
				let _decimals = this.value.indexOf('.') != -1 ? this.value.substr(this.value.indexOf('.') + 1) : '';
				if (_integer.length >= 7 && _decimals.length >= 2) {
					return;
				}
				// 普通小数拦截
				let _val = this.value.indexOf('.') != -1 ? this.value.substr(this.value.indexOf('.') + 1) : '';
				if (_val.length >= 2 && this.curIndex > this.value.indexOf('.')) {
					return;
				}
				// 输入操作
				switch (e) {
					case '.':
						// 当输入为点的时候，如果第一次输入点，则补零
						if (!this.value.length) {
							this.value = '0.';
						} else {
							if (this.value.indexOf('.') > -1) {
								// 如果已经有点，则无效
							} else {
								if (this.curIndex > 0 && this.curIndex == this.value.length) {
									this.value = this.value + '' + e;
								} else if (this.curIndex > 0 && this.curIndex < this.value.length) {
									// 转成数组
									let arr = this.value.split('');
									// 删除操作
									arr.splice(this.curIndex, 0, e);
									// 转成字符串
									let str = arr.join('');
									// 重新赋值
									this.value = str;
								}
							}
						}
						break;
					case '0':
						if (this.value.length === 0) {
							this.value = this.value + '' + e;
						}
						if (Number(this.value) === 0 && this.value.indexOf('.') == -1) {
							// 当输入为零的时候，如果value转换成数字为零，且没有点则无效
						} else {
							if (this.curIndex > 0 && this.curIndex == this.value.length) {
								this.value = this.value + '' + e;
							} else if (this.curIndex > 0 && this.curIndex < this.value.length) {
								if (this.curIndex <= 1 && this.value == '0.') {
									// 避免出现00000.的情况
									return;
								}
								// 转成数组
								let arr = this.value.split('');
								// 删除操作
								arr.splice(this.curIndex, 0, e);
								// 转成字符串
								let str = arr.join('');
								// 重新赋值
								this.value = str;
							}
						}
						break;
					default:
						if (this.value.indexOf('.') == -1) {
							// 避免出现0后面123456789的情况
							this.value = this.value.replace(/\b(0+)/gi, '');
						} else {
							if (this.curIndex <= 1 && this.value == '0.') {
								// 避免出现0123456.的情况
								return;
							}
						}
						if (this.curIndex == 0 && this.value.length == 0) {
							this.value = this.value + '' + e;
						} else if (this.curIndex >= 0) {
							// 转成数组
							let arr = this.value.split('');
							// 删除操作
							arr.splice(this.curIndex, 0, e);
							// 转成字符串
							let str = arr.join('');
							// 重新赋值
							this.value = str;
						}
						break;
				}
			},
			hide() {
				this.$emit('hide');
				this.close();
			},
			confirm() {
				if (this.miniMoney > 0 && this.value < this.miniMoney) {
					return;
				}
				this.$emit('confirm', this.value);
				this.close();
			}
		}
	}
</script>

<style lang="scss" scoped>
	@font-face {
		font-family: 'zm';
		src: url('https://at.alicdn.com/t/font_2442084_o72ps3802ih.eot');
		src: url('https://at.alicdn.com/t/font_2442084_o72ps3802ih.eot?#iefix') format('embedded-opentype'),
			url('https://at.alicdn.com/t/font_2442084_o72ps3802ih.woff2') format('woff2'),
			url('https://at.alicdn.com/t/font_2442084_o72ps3802ih.woff') format('woff'),
			url('https://at.alicdn.com/t/font_2442084_o72ps3802ih.ttf') format('truetype'),
			url('https://at.alicdn.com/t/font_2442084_o72ps3802ih.svg#zm') format('svg');
	}

	.zm {
		font-family: "zm" !important;
		font-size: 16px;
		font-style: normal;
		-webkit-font-smoothing: antialiased;
		-moz-osx-font-smoothing: grayscale;
	}

	.iconbackspace:before {
		content: "\ef11";
	}

	.flex {
		display: flex;
	}

	.flex-wrap {
		flex-wrap: wrap;
	}

	.cu-btn {
		position: relative;
		border: 0rpx;
		display: inline-flex;
		align-items: center;
		justify-content: center;
		box-sizing: border-box;
		padding: 0 30rpx;
		font-size: 28rpx;
		height: 64rpx;
		line-height: 1;
		text-align: center;
		text-decoration: none;
		overflow: visible;
		margin-left: initial;
		transform: translate(0rpx, 0rpx);
		margin-right: initial;
		background-color: #4179FF;
	}

	.cu-btn::after {
		display: none;
	}

	.text-xl {
		font-size: 36rpx;
		font-weight: bold;
		font-family: 'microsoft-yahei';
	}

	.text-black {
		color: #333;
	}

	.active {
		background-color: #ddd !important;
		transform: translate(2rpx, 2rpx);
	}

	.key-container {
		position: fixed;
		bottom: 0;
		left: 0;
		right: 0;
		height: 100%;

		.key-content {
			position: absolute;
			bottom: 0;
			width: 100vw;
			background-color: #F7F7F7;
		}
	}

	.key-box {
		width: 100%;
		box-sizing: border-box;
		padding: 10rpx 10rpx 0;

		.key-left {
			width: 75%;
		}

		.key-right {
			width: 25%;
			display: flex;
			flex-direction: column;
		}

		.key-bottom {
			width: 100%;
			display: flex;
		}
	}

	.del {
		width: 100%;
	}

	.btn-box {
		width: 33.33%;
		padding: 0 10rpx 10rpx 0;
		box-sizing: border-box;
	}

	.btn-zero {
		width: 66.66%;
		padding: 0 10rpx 10rpx 0;
		box-sizing: border-box;
	}

	.btn-point {
		width: 33.33%;
		padding: 0 10rpx 10rpx 0;
		box-sizing: border-box;
	}

	.key-right {
		flex-shrink: 0;
	}

	.key-btn {
		background-color: #fff;
		width: 100%;
		height: 90rpx;
	}

	.confirm {
		width: 100%;
		flex: 1;
		padding: 10rpx 0 10rpx 0;
		box-sizing: border-box;

		button {
			width: 100%;
			height: 100%;

			.confirm-text {
				color: #fff;
				display: block;
				font-size: 32rpx;
			}
		}
	}
</style>